module.exports = {
  /**
   * 用户注册(账号+密码)
   * @url user/pub/register 前端调用的url参数地址
   * @description 用户注册(账号+密码)
   * data 请求参数 说明
   * @param {String} username 用户名，唯一
   * @param {String} password 密码
   * @param {String} captcha 图形验证码
   * res 返回参数说明
   * @param {Number} code 错误码，0表示成功
   * @param {String} msg 详细信息
   * @param {String} token 注册完成自动登录之后返回的token信息
   * @param {String} tokenExpired token过期时间
   * @param {Object} userInfo 用户信息
   */
  main: async (event) => {
    let { data = {}, userInfo, util, originalParam } = event;
    let { uniID, config, pubFun, vk, db, _ } = util;
    let { uid } = data;
    let res = { code: -1, msg: "" };
    // 业务逻辑开始-----------------------------------------------------------
    if (typeof data.username === "number")
      data.username = String(data.username).trim();
    if (typeof data.password === "number")
      data.password = String(data.password).trim();

    let { username, password, captcha, needPermission } = data;

    // 验证图形验证码
    if (captcha) {
      const uniCaptcha = require("uni-captcha");
      const verifyCaptchaRes = await uniCaptcha.verify({
        scene: "register",
        captcha: captcha,
      });
      if (verifyCaptchaRes.code !== 0) {
        return verifyCaptchaRes;
      }
    }

    // 验证规则开始 -----------------------------------------------------------
    let rules = {
      username: [
        {
          required: true,
          validator: function(rule, value, data, callback) {
            // 支持中文、英文、数字和下划线，长度3-32
            const regex = /^[\u4e00-\u9fa5a-zA-Z0-9_]{3,32}$/;
            if (!regex.test(value)) {
              return '用户名长度在3~32之间，可以包含中文、英文、数字和下划线';
            }
            return true;
          },
          message: "用户名长度在3~32之间，可以包含中文、英文、数字和下划线",
          trigger: ["blur", "change"],
        },
      ],
      password: [
        {
          validator: vk.pubfn.validator("password"),
          message: "密码长度在6~18之间，只能包含字母、数字和下划线",
          trigger: "blur",
        },
      ],
    };
    // 验证规则结束 -----------------------------------------------------------
    // 开始进行验证
    let formRulesRes = vk.pubfn.formValidate({
      data: data,
      rules: rules,
    });
    if (formRulesRes.code !== 0) {
      // 表单验证未通过
      return formRulesRes;
    }
    // 表单验证通过，下面写自己的业务逻辑
    res = await uniID.register({
      username,
      password,
      needPermission: false, // 普通用户注册,不需要权限
    });

    // 注册成功后,设置用户可以登录后台,并分配默认角色
    if (res.code === 0 && res.uid) {
      // 设置用户可以登录后台,并分配普通用户角色
      await db
        .collection("uni-id-users")
        .doc(res.uid)
        .update({
          allow_login_background: true, // 允许登录后台
          role: ["normal-user"], // 分配普通用户角色
        });
    }

    // 业务逻辑结束-----------------------------------------------------------
    return res;
  },
};
